# include dependency
include(CMakePackageConfigHelpers)
include(GNUInstallDirs)

# set package information
set(CPACK_PACKAGE_NAME ${PROJECT_NAME})
set(CPACK_GENERATOR "External")
set(CPACK_CMAKE_GENERATOR "Ninja")
set(CPACK_EXTERNAL_PACKAGE_SCRIPT ${CMAKE_SOURCE_DIR}/cmake/package_script.cmake)
set(CPACK_EXTERNAL_ENABLE_STAGING true)
set(CPACK_TEMPORARY_PACKAGE_FILE_NAME ${CMAKE_SOURCE_DIR}/build/package/mindspore)
set(CPACK_TEMPORARY_INSTALL_DIRECTORY ${CMAKE_SOURCE_DIR}/build/package/mindspore)
set(CPACK_PACK_ROOT_DIR ${BUILD_PATH}/package/)
set(CPACK_CMAKE_SOURCE_DIR ${CMAKE_SOURCE_DIR})
set(CPACK_PYTHON_EXE ${Python3_EXECUTABLE})
set(CPACK_PYTHON_VERSION ${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR})

if(ENABLE_GPU)
  set(CPACK_MS_BACKEND "ms")
elseif(ENABLE_CPU)
  set(CPACK_MS_BACKEND "ms")
else()
  set(CPACK_MS_BACKEND "debug")
endif()
set(CPACK_MS_PACKAGE_NAME "mindspore")
include(CPack)

# set install path
set(INSTALL_LIB_DIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "Installation directory for libraries")
set(INSTALL_PY_DIR ".")
set(INSTALL_BASE_DIR ".")
set(INSTALL_BIN_DIR "bin")
set(INSTALL_CFG_DIR "config")
set(INSTALL_PLUGIN_DIR ".")

set(INSTALL_LIB_DIR ".")
set(onednn_LIBPATH ${onednn_LIBPATH}/../bin/)
set(glog_LIBPATH ${glog_LIBPATH}/../bin/)
set(opencv_LIBPATH ${opencv_LIBPATH}/../bin/)
set(jpeg_turbo_LIBPATH ${jpeg_turbo_LIBPATH}/../bin/)
set(sqlite_LIBPATH ${sqlite_LIBPATH}/../bin/)
set(tinyxml2_LIBPATH ${tinyxml2_LIBPATH}/../bin/)

message("offline debugger does not support windows system temporarily")

file(GLOB PROTO_PY_PB2_LST ${CMAKE_SOURCE_DIR}/build/mindspore/proto_py/proto/*_pb2.py)
file(COPY ${PROTO_PY_PB2_LST} DESTINATION ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/train)

# set package files
install(
  TARGETS _c_expression
  DESTINATION ${INSTALL_BASE_DIR}
  COMPONENT mindspore
)

install(
  TARGETS mindspore_core mindspore_ops mindspore_common mindspore_ms_backend mindspore_pyboost mindspore_pynative
        mindspore_backend_manager mindspore_hardware_abstract mindspore_frontend mindspore_profiler
        mindspore_memory_pool mindspore_runtime_pipeline mindspore_backend_common
        mindspore_runtime_utils mindspore_cluster mindspore_tools mindspore_pynative_utils mindspore_ops_host
  DESTINATION ${INSTALL_LIB_DIR}
  COMPONENT mindspore
)

if(MSVC AND DEBUG_MODE)
  install(
    FILES  $<TARGET_PDB_FILE:_c_expression>
    DESTINATION ${INSTALL_BASE_DIR}
    COMPONENT mindspore
  )

  install(
    FILES  $<TARGET_PDB_FILE:mindspore_core> $<TARGET_PDB_FILE:mindspore_ops>
    $<TARGET_PDB_FILE:mindspore_common>
    $<TARGET_PDB_FILE:mindspore_ms_backend>
    $<TARGET_PDB_FILE:mindspore_backend_common>
    $<TARGET_PDB_FILE:mindspore_pyboost>
    $<TARGET_PDB_FILE:mindspore_pynative>
    $<TARGET_PDB_FILE:mindspore_backend_manager>
    $<TARGET_PDB_FILE:mindspore_hardware_abstract>
    $<TARGET_PDB_FILE:mindspore_profiler>
    $<TARGET_PDB_FILE:mindspore_runtime_utils>
    $<TARGET_PDB_FILE:mindspore_memory_pool>
    $<TARGET_PDB_FILE:mindspore_runtime_pipeline>
    $<TARGET_PDB_FILE:mindspore_dump>
    $<TARGET_PDB_FILE:mindspore_tools>
    $<TARGET_PDB_FILE:mindspore_pynative_utils>
    $<TARGET_PDB_FILE:mindspore_ops_host>
    DESTINATION ${INSTALL_LIB_DIR}
    COMPONENT mindspore
  )

endif()

if(USE_GLOG)
  if(MSVC)
      if(DEBUG_MODE)
          file(GLOB_RECURSE GLOG_LIB_LIST ${glog_LIBPATH}/mindspore_glogd.dll)
      else()
          file(GLOB_RECURSE GLOG_LIB_LIST ${glog_LIBPATH}/mindspore_glog.dll)
      endif()
  else()
    file(GLOB_RECURSE GLOG_LIB_LIST ${glog_LIBPATH}/libmindspore_glog.dll)
  endif()
  install(
    FILES ${GLOG_LIB_LIST}
    DESTINATION ${INSTALL_LIB_DIR}
    COMPONENT mindspore
  )
endif()

if(ENABLE_MINDDATA)
  message("icu4c does not support windows system temporarily")
  install(
    TARGETS _c_dataengine _c_mindrecord
    DESTINATION ${INSTALL_BASE_DIR}
    COMPONENT mindspore
  )
  if(MSVC AND DEBUG_MODE)
    install(
      FILES $<TARGET_PDB_FILE:_c_dataengine> $<TARGET_PDB_FILE:_c_mindrecord>
      DESTINATION ${INSTALL_BASE_DIR}
      COMPONENT mindspore
    )
  endif()
  if(MSVC)
    file(GLOB_RECURSE OPENCV_LIB_LIST
      ${opencv_LIBPATH}/opencv_core*
      ${opencv_LIBPATH}/opencv_imgcodecs*
      ${opencv_LIBPATH}/opencv_imgproc*
      )
  else()
    file(GLOB_RECURSE OPENCV_LIB_LIST
      ${opencv_LIBPATH}/libopencv_core*
      ${opencv_LIBPATH}/libopencv_imgcodecs*
      ${opencv_LIBPATH}/libopencv_imgproc*
      )
  endif()
  install(
    FILES ${OPENCV_LIB_LIST}
    DESTINATION ${INSTALL_LIB_DIR}
    COMPONENT mindspore
  )

  if(MSVC)
    if(ENABLE_FFMPEG)
      set(ffmpeg_LIB_PATH ${CMAKE_SOURCE_DIR}/build/mindspore/ffmpeg_lib)
      file(GLOB FFMPEG_LIB_LIST ${ffmpeg_LIB_PATH}/bin/*.dll)
      install(
        FILES ${FFMPEG_LIB_LIST}
        DESTINATION ${INSTALL_LIB_DIR}
        COMPONENT mindspore
      )
    endif()
  endif()

  if(MSVC)
      if(DEBUG_MODE)
          file(GLOB_RECURSE TINYXML2_LIB_LIST ${tinyxml2_LIBPATH}/tinyxml2d.dll)
      else()
          file(GLOB_RECURSE TINYXML2_LIB_LIST ${tinyxml2_LIBPATH}/tinyxml2.dll)
      endif()
  else()
    file(GLOB_RECURSE TINYXML2_LIB_LIST ${tinyxml2_LIBPATH}/libtinyxml2.dll)
  endif()

  install(
    FILES ${TINYXML2_LIB_LIST}
    DESTINATION ${INSTALL_LIB_DIR}
    COMPONENT mindspore
  )
endif()

if(ENABLE_CPU)
  file(GLOB_RECURSE DNNL_LIB_LIST ${onednn_LIBPATH}/dnnl.dll)
  install(
    FILES ${DNNL_LIB_LIST}
    DESTINATION ${INSTALL_LIB_DIR}
    COMPONENT mindspore
  )
  install(
    TARGETS nnacl
    DESTINATION ${INSTALL_LIB_DIR}
    COMPONENT mindspore
  )
  install(
    TARGETS mindspore_cpu
    DESTINATION ${INSTALL_LIB_DIR}
    COMPONENT mindspore
  )
  install(
    TARGETS mindspore_ops_cpu
    DESTINATION ${INSTALL_PLUGIN_DIR}
    COMPONENT mindspore
  )
endif()

if(ENABLE_MPI)
  if(ENABLE_CPU)
    install(
      TARGETS mpi_collective
      DESTINATION ${INSTALL_LIB_DIR}
      COMPONENT mindspore
    )
  endif()
endif()

if(ENABLE_GPU)
  if(ENABLE_MPI)
    install(
      TARGETS nvidia_collective
      DESTINATION ${INSTALL_LIB_DIR}
      COMPONENT mindspore
    )
  endif()
  install(
    TARGETS cuda_ops
    DESTINATION ${INSTALL_LIB_DIR}
    COMPONENT mindspore
  )
endif()

get_filename_component(CXX_DIR ${CMAKE_CXX_COMPILER} PATH)
file(GLOB CXX_LIB_LIST ${CXX_DIR}/*.dll)

string(REPLACE "\\" "/" SystemRoot $ENV{SystemRoot})
file(GLOB VC_LIB_LIST ${SystemRoot}/System32/msvcp140.dll ${SystemRoot}/System32/vcomp140.dll)

file(GLOB JPEG_LIB_LIST ${jpeg_turbo_LIBPATH}/*.dll)

install(
  FILES ${CXX_LIB_LIST} ${JPEG_LIB_LIST} ${VC_LIB_LIST}
  DESTINATION ${INSTALL_LIB_DIR}
  COMPONENT mindspore
)

if(NOT MSVC)
  file(GLOB SQLITE_LIB_LIST ${sqlite_LIBPATH}/*.dll)
  install(
    FILES ${SQLITE_LIB_LIST}
    DESTINATION ${INSTALL_LIB_DIR}
    COMPONENT mindspore
  )
endif()

# set python files
file(GLOB MS_PY_LIST ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/*.py)
install(
  FILES ${MS_PY_LIST}
  DESTINATION ${INSTALL_PY_DIR}
  COMPONENT mindspore
)

install(
  DIRECTORY
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/nn
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/_extends
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/parallel
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/mindrecord
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/numpy
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/train
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/boost
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/common
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/ops
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/ops_generate
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/communication
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/profiler
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/rewrite
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/safeguard
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/run_check
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/experimental
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/graph
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/mint
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/multiprocessing
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/hal
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/utils
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/tools
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/runtime
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/device_context
  ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/onnx
  DESTINATION ${INSTALL_PY_DIR}
  COMPONENT mindspore
)

if(EXISTS ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/dataset)
  install(
    DIRECTORY ${CMAKE_SOURCE_DIR}/mindspore/python/mindspore/dataset
    DESTINATION ${INSTALL_PY_DIR}
    COMPONENT mindspore
  )
endif()

## Public header files for minddata
install(
  FILES ${CMAKE_SOURCE_DIR}/mindspore/ccsrc/minddata/dataset/include/dataset/config.h
  ${CMAKE_SOURCE_DIR}/mindspore/ccsrc/minddata/dataset/include/dataset/constants.h
  ${CMAKE_SOURCE_DIR}/mindspore/ccsrc/minddata/dataset/include/dataset/execute.h
  ${CMAKE_SOURCE_DIR}/mindspore/ccsrc/minddata/dataset/include/dataset/text.h
  ${CMAKE_SOURCE_DIR}/mindspore/ccsrc/minddata/dataset/include/dataset/transforms.h
  ${CMAKE_SOURCE_DIR}/mindspore/ccsrc/minddata/dataset/include/dataset/vision.h
  ${CMAKE_SOURCE_DIR}/mindspore/ccsrc/minddata/dataset/include/dataset/vision_lite.h
  ${CMAKE_SOURCE_DIR}/mindspore/ccsrc/minddata/dataset/include/dataset/vision_ascend.h
  DESTINATION ${INSTALL_BASE_DIR}/include/dataset
  COMPONENT mindspore
)

## op plugin header file
install(
    DIRECTORY ${CMAKE_SOURCE_DIR}/mindspore/ops/kernel/cpu/custom/kernel_mod_impl
    DESTINATION ${INSTALL_BASE_DIR}/include/mindspore/ops/kernel/cpu/custom/
    COMPONENT mindspore
    FILES_MATCHING PATTERN "*.h"
)

## config files
install(
        FILES ${CMAKE_SOURCE_DIR}/config/op_info.config
        DESTINATION ${INSTALL_CFG_DIR}
        COMPONENT mindspore
)
